// 使用 require.context 自动创建路由配置
// 参数
// 1. 一个要搜索的目录
// 2. 一个标记表示是否还要搜索子目录
// 3. 一个匹配文件的正则表达式
// 仿照 nuxt
let files = require.context('@/pages', true, /\.vue$/)

// console.log(files.keys())  通过这个方法拿到所有组件的路由地址

// 我们的目的就是通过这里编写的方法, 生成路由配置 [{path:'xx',component:() =>import('xx')}]

let repeatRoutes = files.keys().map(path => {
  // console.log(path)
  // 1. 需要把path ./Home/Users/index.vue 这样的变成 /Home/Users
  // 2. 使用正则过滤掉 /index.vue 或者过滤掉.vue
  let regExp = /(\/index\.vue|\.vue)$/
  let com = files(path).default // 得到组件

  path = path.replace(regExp, '').substring(1)
  // console.log(path)

  // console.log(com.meta)
  return {
    redirect: com.redirect ?? null, //路由重定项
    name: com.name ?? path.substring(1).split('/').join('-'), // 给每个组件添加name属性 具名路由
    meta: com.meta ?? {}, // 路由元信息
    path: path.toLowerCase(),
    component: () => import('@/pages' + path)
  }
})

// console.log(repeatRoutes) //扁平化的路由配置

// 需要把 repeatRoutes 转换成"树形"数据

const convertTree = repeatRoutes => {
  // 每条数据添加 id, 如果是嵌套路由, 那么加上 pid
  // 将path作为当前对象的id
  // pid

  let treeRoutes = [] // 声明一个空数组用于存放树形的routes配置

  // 时间复杂度O(n^2)
  // 遍历 repeatRoutes 对数据的id进行处理
  repeatRoutes.forEach(route => {
    // 将path作为当前对象的id
    // let pathArr = route.path.split('/').splice(1)
    let pathArr = route.path.substring(1).split('/')
    // 先给每个对象生成id
    route.id = pathArr.join('-')
    // console.log(pathArr)
    // 如果数组中的长度大于1, 说明是子路由, 需要添加pid
    if (pathArr.length > 1) {
      // pid就是parentid 父级id 数组中的最后一项去掉就是父级id
      let pidArr = [...pathArr] // 浅拷贝
      // console.log(pidArr)
      pidArr.pop()
      route.pid = pidArr.join('-')
    }
    // console.log(route)
  })
  // 再次进行遍历
  repeatRoutes.forEach(route => {
    // 找父节点 找数组的 pid 和 数据的 id 相等的项
    let parent = repeatRoutes.find(v => v.id === route.pid)
    // console.log(parent)
    if (parent) {
      // 当前的route对象找到父节点了
      // 判断父节点有没有children属性, 没有就创建
      if (!parent.children) {
        // 没找到就添加 children属性值为 []
        parent.children = []
      }
      // 对自己路由路径进行处理 只取最后一段
      route.path = route.path.split('/').pop() // [ '', 'home', 'aa' ]
      // 把当前route节点添加到其父节点children属性中
      parent.children.push(route)
    } else {
      // 没有找到父节点 就添加到树形节点数组中
      treeRoutes.push(route)
    }
  })

  return treeRoutes
}

let result = convertTree(repeatRoutes)

// console.log(result)

export default result
